package info.motteke.mixivoice4j;


import java.util.Collection;
import java.util.List;
import java.util.Set;

/**
 * つぶやきを表します。
 *
 * @author Y.Wakamatsu
 */
public class Entry extends Voice {

    private final Comments comments;

    private int knownCommentNumber;

    private final Favorite favorites;

    private int knownFavoriteNumber;

    private final ImageUrl thumbnail;

    private final ImageUrl image;

    /* package */ Entry(EntryBuilder entryBuilder) {
        super(entryBuilder.getId(), entryBuilder.getUser(), entryBuilder.getBody());
        this.comments = entryBuilder.getComments();
        this.favorites = entryBuilder.getFavorites();
        this.thumbnail = entryBuilder.getThumbnail();
        this.image = entryBuilder.getImage();
    }

    /**
     * この発言が持つコメントを返します。
     */
    public List<Comment> getAllComments() {
        return comments.asList();
    }

    /**
     * この発言が持つコメントを返します。
     */
    /* package */ Comments getComments() {
        return comments;
    }

    /**
     * この発言にイイネ！をつけたユーザを取得します。
     */
    public Set<User> getAllFavorites() {
        return favorites.asSet();
    }

    /**
     * この発言のイイネ！を取得します。
     */
    /* package */ Favorite getFavorite() {
        return favorites;
    }

    /**
     * この発言が持つ画像のサムネイルのURLを取得します。
     */
    public ImageUrl getImageThumbnailUrl() {
        return thumbnail;
    }

    /**
     * この発言が持つ画像のURLを取得します。
     */
    public ImageUrl getImageUrl() {
        return image;
    }

    public int getKnownCommentNumber() {
        return knownCommentNumber;
    }

    public void setKnownCommentNumber(int knownCommentNumber) {
        this.knownCommentNumber = knownCommentNumber;
    }

    public int getKnownFavoriteNumber() {
        return knownFavoriteNumber;
    }

    public void setKnownFavoriteNumber(int knownFavoriteNumber) {
        this.knownFavoriteNumber = knownFavoriteNumber;
    }

    @Override
    public final Entry getParent() {
        return this;
    }

    public boolean addComment(Comment c) {
        return comments.add(c);
    }

    public boolean addAllComments(Collection<Comment> comments) {
        return this.comments.addAll(comments);
    }

    public boolean addFavorite(User user) {
        return favorites.add(user);
    }

    public boolean addAllFavorites(Collection<User> favorites) {
        return this.favorites.addAll(favorites);
    }

    @Override
    public String toString() {
        return String.format("Entry [%s:%s %s (%d comments, %s)]",
        getUser().getNickName(), getId(), getBody().toString(), comments.asList().size(), favorites.asSet());
    }


}
